perm filename PRETZL.FAI[MPX,SYS] blob
sn#218660 filedate 1983-02-26 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00018 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002
C00007 00003 TITLE PRETZL MICROCODE ASSEMBLER FOR THE MAPPIPRETZEL
C00009 00004 GO: RESET
C00012 00005 PREDEF, ADDSYM, SYMLOK
C00015 00006 UUOH, AERR, AXPAND, AWARN
C00018 00007 DECOUT, SDMPLI, DMPLIN, LSTOUT, LST9, LST12, LST16, LSTSTR, LSTNUM
C00021 00008 SYMLST
C00023 00009 INSLST
C00024 00010 LIST
C00027 00011 ASSEMB, DOLINE, STRBIN
C00035 00012 DOLCOM, DOLEQU, DOLMSK
C00041 00013 EVAL
C00052 00014 GETTOK, GTCHR
C00055 00015 PSEUTB, PSEUT2, PSEUDT, ACOMNT, ALOC, AEND, ADEBUG, RDNUM, RDSNUM, SKPEOL, ASET
C00059 00016 BRCND, BRCND1, BRCND2
C00060 00017 SYMBOL TABLE FORMAT, PRSYMS, PSEUTB
C00062 00018 CONSTANTS, VARIABLES AND TABLES
C00066 ENDMK
C⊗;
COMMENT ⊗
{} indicate optional parameters
alu instruction:
{d1}{,d2}{,d3}=alu operation/SPEC=nnn
destination class A:
AR
destination class B:
BR
destination class C:
~SEL_BUS_REG
MA_HI
MA_LO
VBIT
ABIT
MAPRAM
~PTPNT
MAP_ENB
Only one of d1, d2, d3 may be of class A, one of class B and one of class C.
For example, the following are legal destinations:
MA_HI,BR=
AR=
BR,AR=
VBIT=
BR,~PTPNT,AR=
whereas the following are illegal:
MA_HI,MA_LO=
VBIT,AR,AR=
BR,~PTPNT,ABIT=
If neither AR nor BR is specified and there is no destination specified from
class C, then the = may be omitted.
The ALU operation is specified by an infix operation on zero, one or two
operands. The operands are called the A operand and the B operand. The
B operand if present must be AR or BR. The A operand is of the following
form:
≡number or ≡constant-symbol
mask-specification
A mask-specification is of the following form:
<S-field←rotate,mask←mask-rotate,B operand>
If the ← and the following rotate are omitted, the rotate is assumed to be zero.
If the mask and mask rotate is omitted, it is assumed to be 177777←0. If the
B operand is omitted it is assumed to be AR.
The S-field may be any of the following:
AR
BR
PADR_MICRO
MICRQ_SEL
MS(0-3)
MS(4-19)
MS(20-35)
~VBIT_NEW_BIT
~VBIT
PTPNT
branch instruction:
mask-specification JUMPIF branch-condition branch-address/SPEC=nnn
A branch condition is one of the following:
MEM_DONE
~MEM_DONE
MIOBC_BUSY
RESET_COND
MASKIS0
~MASKIS0
~MASK[0]
MASK[0]
MICRO_RPE
TRUE
MICRQ_RQ_SYNC
Pseudo ops
COMMENT <non-blank> ignored <same-non-blank>
LOC number
Sets the location counter to the number.
END
Defines the end of the assembly.
DEBUG
Has no effect, but is useful for debugging the assemler.
SET constant-symbol=number
Defines the value of a constant symbol. This symbol may be used
only after an ≡ in an ALU statement.
⊗
TITLE PRETZL MICROCODE ASSEMBLER FOR THE MAPPIPRETZEL
F←0
A←1
B←2
C←3
D←4
E←5
T←6
TT←7
L←10 ;LOCATION COUNTER
P←17
SRC←←1
LST←←2
BIN←←3
INS←←4
ROM←←5
;LEFT HALF F BITS
ENDASM←←400000 ;END PSEUDO OP SEEN
GOTONE←←200000 ;FLAG TO GTCHR TO JUST RETURN A
ARDST ←←100000 ;THE AR IS A DESTINATION
BRDST ←← 40000 ;THE BR IS A DESTINATION
GOTMSK←← 20000 ;HAVE ASSEMBLED A MASK FIELD
;RIGHT HALF F BITS
EVNUM ←←400000 ;EVLNXT PARSED A NUMBER
EVMASK←←200000 ;EVLNXT PARSED A MASK SPECIFICATION
EVAR ←←100000 ;EVLNXT PARSED AR
EVBR ←← 40000 ;EVLNXT PARSED BR
PEVAR ←← 20000 ;EVLNXT PARSED AR (PERMANENT)
PEVBR ←← 10000 ;EVLNXT PARSED BR (PERMANENT)
TMPBIT←← 1
;SYMBOL TYPES
DSTTYP←←1 ;DESTINATION TYPE SYMBOLS
STYP←←2 ;S TYPE SYMBOLS
BRTYP←←3 ;BRANCH TYPE SYMBOLS
ADRTYP←←4 ;BRANCH ADDRESS TYPE SYMBOLS
FIXTYP←←5 ;FIXUP TYPE SYMBOLS
CONTYP←←6 ;CONSTANT TYPE SYMBOLS
;USER UUOS
OPDEF ERR [001000,,0]
OPDEF XPAND [002000,,0]
OPDEF WARN [003000,,0]
MAXUUO←←3
DEFINE GETFRE (AC) <
AOS AC,NXTFRE
CAML AC,SYMPNT
XPAND
SUBI AC,1
>
GO: RESET
MOVE P,[-100,,PDL-1]
HLRZ A,JOBSA↑
MOVEM A,JOBFF↑
CORE A, ;CORE DOWN TO INITIAL AMOUNT
JRST 4,.
MOVE A,[JSR UUOH]
MOVEM A,41
INIT SRC,0
SIXBIT /DSK/
SRCHDR
JRST 4,.
MOVE A,[SRCFIL,,B]
BLT A,E
LOOKUP SRC,B
JRST NOMIC
INBUF SRC,2
INIT BIN,17
SIXBIT /DSK/
0
JRST 4,.
MOVE A,[BINFIL,,B]
BLT A,E
ENTER BIN,B
JRST 4,.
INIT LST,0
SIXBIT /DSK/
LSTHDR,,
JRST 4,.
MOVE A,[LSTFIL,,B]
BLT A,E
ENTER LST,B
JRST 4,.
OUTBUF LST,2
INIT ROM,0
SIXBIT /DSK/
ROMHDR,,
JRST 4,.
MOVE A,[ROMFIL,,B]
BLT A,E
ENTER ROM,2
JRST 4,.
OUTBUF ROM,2
INIT INS,0
SIXBIT /DSK/
INSHDR,,
JRST 4,.
MOVE A,[INSFIL,,B]
BLT A,E
ENTER INS,B
JRST 4,.
OUTBUF INS,2
SETZM BINBUF
MOVE A,[BINBUF,,BINBUF+1]
BLT A,BINBUF+377
SETZB F,L
MOVE A,JOBFF
MOVEM A,NXTFRE
ADDI A,400
MOVEM A,SYMPNT
CORE A,
JRST 4,.
PUSHJ P,PREDEF ;ENTER PREDEFINED SYMBOLS INTO SYMBOL TABLE
MOVEI A,1
MOVEM A,PAGE
MOVEM A,LINE
PUSHJ P,ASSEMB
OUTSTR [ASCIZ /
DONE
/]
MOVE A,[-400,,BINBUF-1]
MOVEI B,0
OUTPUT BIN,A
PUSHJ P,INSLST
PUSHJ P,SYMLST
PUSHJ P,LIST
EXIT
NOMIC: OUTSTR [ASCIZ /WHAT, NO MICROCODE?
/]
EXIT
;PREDEF, ADDSYM, SYMLOK
;ENTER PREDEFINED SYMBOLS (PRSYMS) INTO THE SYMBOL TABLE
PREDEF: MOVE A,SYMPNT
ADDI A,LPRSYM ;1 + LAST ADDRESS NEEDED
MOVEI B,(A)
CORE B,
JRST 4,.
MOVE B,SYMPNT
HRLI B,PRSYMS
BLT B,-1(A) ;MOVE PREDEFINED SYMBOLS TO SYMTAB
MOVSI B,PRSYMS
MOVEM A,SYMNXT
POPJ P,
;ADD SYMBOL IN TOKBUF TO SYMBOL TABLE AT THE END
;THE VALUE WITH TYPE IS IN A
;FIRST HAVE TO COPY THE SYMBOL TEXT TO FREE STORAGE FROM TOKBUF
ADDSYM: PUSH P,D
PUSH P,C
PUSH P,E
MOVE E,[440700,,TOKBUF]
HRRZ D,NXTFRE
MOVE B,D
HRLI D,440700
ADDSY0: AOS C,NXTFRE
CAML C,SYMPNT
XPAND
ADDSY1: ILDB C,E
IDPB C,D
JUMPE C,ADDSY2
TLNE E,760000
JRST ADDSY1
JRST ADDSY0
ADDSY2: POP P,E
POP P,C
MOVE D,SYMNXT
ADDI D,2
MOVEM D,SYMNXT
CAML D,JOBREL↑
CORE D,
JFCL
MOVE D,SYMNXT
MOVEM A,-2(D)
HRRZM B,-1(D) ;STORE FIXUP,,SYMBOL POINTERS
POP P,D
POPJ P,
;LOOKUP TOKBUF IN SYMBOL TABLE. SKIP RETURN IF FOUND, POINTER TO
;SYMBOL TABLE ENTRY IN B. CALL WITH TYPE OF SYMBOL TO LOOK FOR IN
;WORD FOLLOWING THE CALL. ZERO MEANS ANYTHING IS OK.
SYMLOK: MOVE B,SYMPNT
SYMLO1: LDB A,[POINT 9,(B),17] ;GET TYPE OF SYMBOL
SKIPE @(P)
CAMN A,@(P)
CAIA
JRST SYMLO2
HRRZ A,1(B) ;POINTER TO SYMBOL NAME
PUSHJ P,SYMCMP ;COMPARE AGAINST TOKBUF, SKIP IF NOT EQUAL
JRST CPOPJ2
SYMLO2: ADDI B,2
CAME B,SYMNXT
JRST SYMLO1
JRST CPOPJ1 ;NOT FOUND
;COMPARE TOKBUF AGAINST STRING POINTED TO BY A. SKIP IF NOT EQUAL
SYMCMP: HRLI A,440700
MOVE C,[440700,,TOKBUF]
SYMCM1: ILDB D,A
ILDB E,C
CAIE D,(E)
JRST CPOPJ1 ;THEY ARE NOT EQUAL
JUMPE D,CPOPJ ;IF THEY ARE BOTH ZERO, WE HAVE A MATCH
JRST SYMCM1
;UUOH, AERR, AXPAND, AWARN
UUOH: 0
MOVEM 17,UUOACS+17
MOVEI 17,UUOACS
BLT 17,UUOACS+16
MOVE 17,UUOACS+17
LDB A,[POINT 9,40,8]
CAILE A,MAXUUO
JRST [ OUTSTR [ASCIZ /ILLEGAL USER UUO
/]
JRST 4,.]
LDB B,[POINT 4,40,12] ;AC FIELD
HRRZ C,40 ;EFFECTIVE ADDRESS
PUSHJ P,@UUODTB-1(A)
CAIA
AOS UUOH
MOVSI 17,UUOACS
BLT 17,17
JRST 2,@UUOH
UUODTB: AERR
AXPAND
AWARN
HERALD: OUTSTR [ASCIZ /
**********
PAGE /]
MOVE D,PAGE
PUSHJ P,DECOUT
OUTSTR [ASCIZ / LINE /]
MOVE D,LINE
PUSHJ P,DECOUT
OUTSTR [ASCIZ /
/]
POPJ P,
AERR: PUSHJ P,HERALD
PUSH P,LINPNT
PUSHJ P,SDMPLI ;COUNTS LINE
JFCL
POP P,LINPNT
MOVEI A,12
IDPB A,LINPNT
MOVEI A,0
IDPB A,LINPNT
OUTSTR LINBUF
MOVE A,[440700,,LINBUF]
MOVEM A,LINPNT
AERR1: PUSHJ P,GTCHR
CAIE A,12
JRST AERR1
MOVEI A,0
IDPB A,LINPNT
OUTSTR LINBUF
PUSH P,LINE
PUSHJ P,SDMPLI
JFCL
POP P,LINE
OUTSTR (C)
POPJ P,
AWARN: PUSHJ P,HERALD
OUTSTR [ASCIZ /WARNING!! /]
OUTSTR (C)
POPJ P,
AXPAND: HRRZ A,SYMNXT ;POINTER TO WHERE THE NEXT SYMBOL GOES
SUB A,SYMPNT ;CURRENT SIZE OF THE SYMBOL TABLE ...
CAIGE A,1000
MOVEI A,1000 ;...OR 1000, WHICHEVER IS GREATER
HRRZ B,SYMNXT
ADDI B,-1(A)
MOVE C,B
CORE B,
JRST 4,.
HRRZ B,SYMPNT
ADDI B,(A)
HRL B,SYMPNT
BLT B,(C) ;MOVE THE SYMBOL TABLE
ADDM A,SYMPNT
ADDM A,SYMNXT
POPJ P,
CPOPJ2: AOS (P)
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
;DECOUT, SDMPLI, DMPLIN, LSTOUT, LST9, LST12, LST16, LSTSTR, LSTNUM
;PRINT D AS DECIMAL
DECOUT: PUSH P,E
PUSHJ P,DECOU1
POP P,E
POPJ P,
DECOU1: IDIVI D,12
JUMPE D,DECOU2
HRLM E,(P)
PUSHJ P,DECOU1
HLRZ E,(P)
DECOU2: ADDI E,"0"
OUTCHR E
POPJ P,
;DUMP OUT LINBUF INTO LISTING FILE. SDMPLI IS CALLED IF NO BINARY THIS LINE
SDMPLI: AOS (P)
TROA F,TMPBIT
DMPLIN: TRZ F,TMPBIT
PUSH P,A
PUSH P,B
AOS LINE
PUSH P,D
MOVEI D,(L) ;GET LOCATION COUNTER
TRNN F,TMPBIT
PUSHJ P,LST9 ;PRINT LOCATION COUNTER
POP P,D
MOVEI A,11
PUSHJ P,LSTOUT
MOVE B,[440700,,LINBUF]
DMPLI1: ILDB A,B
JUMPE A,DMPLI2
PUSHJ P,LSTOUT
CAME B,LINPNT
JRST DMPLI1
DMPLI2: POP P,B
MOVE A,[440700,,LINBUF]
MOVEM A,LINPNT
POP P,A
POPJ P,
LSTOUT: SOSG LSTHDR+2
OUT LST,
JRST .+2
JRST 4,.
IDPB A,LSTHDR+1
POPJ P,
LST9: LSH D,=27
MOVEI E,3
JRST LSTN
LST12: LSH D,=24
MOVEI E,4
JRST LSTN
LST16: LSH D,=20
LSH D,-2
MOVEI E,6
LSTN: MOVEI C,0
LSHC C,3
MOVEI A,"0"(C)
PUSHJ P,LSTOUT
SOJG E,LSTN
POPJ P,
LSTSTR: HRLI C,440700
LSTST1: ILDB A,C
JUMPE A,CPOPJ
PUSHJ P,LSTOUT
JRST LSTST1
LSTNUM: IDIVI D,10
JUMPE D,LSTNU1
HRLM E,(P)
PUSHJ P,LSTNUM
HLRZ E,(P)
LSTNU1: MOVEI A,"0"(E)
JRST LSTOUT
;SYMLST
SYMLST: SETZM UNSYMS
MOVEI A,14
PUSHJ P,LSTOUT
MOVEI C,[ASCIZ /SYMBOL TABLE
/]
PUSHJ P,LSTSTR
MOVE B,SYMPNT
SYMLS1: LDB A,[POINT 9,(B),17] ;GET TYPE
CAIN A,FIXTYP
JRST SYMLS2
CAIE A,CONTYP
CAIN A,ADRTYP
JRST SYMLS4
SYMLS3: ADDI B,2
CAME B,SYMNXT
JRST SYMLS1
POPJ P,
SYMLS2: SKIPN UNSYMS
OUTSTR [ASCIZ /UNDEFINED SYMBOLS:
/]
SETOM UNSYMS
HRRZ C,1(B)
OUTSTR (C)
OUTSTR [BYTE (7) 15,12]
JRST SYMLS3
SYMLS4: HRRZ C,1(B) ;POINTER TO SYMBOL
PUSHJ P,LSTSTR
MOVEI A,11
PUSHJ P,LSTOUT
HRRZ D,(B) ;VALUE OF SYMBOL
PUSHJ P,LST16
MOVEI C,[BYTE (7) 15,12]
PUSHJ P,LSTSTR
JRST SYMLS3
;INSLST
INSLST: MOVSI A,-40
TRZ F,TMPBIT
PUSHJ P,INSLS1
HRLI A,-340
TRO F,TMPBIT
INSLS1: MOVEI C,"¬"
TRNE F,TMPBIT
PUSHJ P,INSOUT ;OUTPUT LEADING ¬ IF DOING RAM LOCATIONS
MOVE D,BINBUF(A)
MOVEI B,=12
INSLS2: MOVEI C,0
LSHC C,3
ADDI C,"0"
PUSHJ P,INSOUT
SOJG B,INSLS2
MOVEI C,15
PUSHJ P,INSOUT
MOVEI C,12
PUSHJ P,INSOUT
AOBJN A,INSLS1
POPJ P,
INSOUT: TRNE F,TMPBIT
JRST INSOU1
SOSG ROMHDR+2
OUT ROM,
CAIA
JRST 4,.
IDPB C,ROMHDR+1
POPJ P,
INSOU1: SOSG INSHDR+2
OUT INS,
CAIA
JRST 4,.
IDPB C,INSHDR+1
POPJ P,
;LIST
LIST: MOVEI A,14
PUSHJ P,LSTOUT
MOVN B,L
HRLZ B,B
LIST1: MOVE C,BINBUF(B)
MOVEM C,BINWRD
MOVEI C,[ASCIZ /ROM LOC=/]
HRRZ D,B
CAIL D,40
MOVEI C,[ASCIZ /RAM LOC=/]
PUSHJ P,LSTSTR
PUSHJ P,LST9 ;TYPE OUT ADDRESS AS THREE OCTAL DIGITS
MOVEI C,[ASCIZ / OP=/]
PUSHJ P,LSTSTR
LDB A,OPPNT
ADDI A,"0"
PUSHJ P,LSTOUT
MOVEI C,[ASCIZ / BSEL=/]
PUSHJ P,LSTSTR
LDB D,BSLPNT
PUSHJ P,LSTNUM
LDB A,OPPNT
CAIN A,2
JRST LSTOP2
PUSHJ P,LSTF1
LDB A,OPPNT
SOJE A,LSTOP1
LIST2: PUSHJ P,LSTF2
LIST3: MOVEI C,[BYTE (7) 15,12]
PUSHJ P,LSTSTR
AOBJN B,LIST1
POPJ P,
LSTOP2: MOVEI C,[ASCIZ / CONST=/]
PUSHJ P,LSTSTR
LDB D,CONPNT ;OP2, PRINT FIELD 1 AS A CONSTANT
PUSHJ P,LST16
JRST LIST2
LSTOP1: MOVEI C,[ASCIZ / BRCOND=/]
PUSHJ P,LSTSTR
LDB D,BRCPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / BRADDR=/]
PUSHJ P,LSTSTR
LDB D,BRAPNT
PUSHJ P,LSTNUM
JRST LIST3
LSTF1: MOVEI C,[ASCIZ / SPEC=/]
PUSHJ P,LSTSTR
LDB D,SPCPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / S=/]
PUSHJ P,LSTSTR
LDB D,SPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / SROT=/]
PUSHJ P,LSTSTR
LDB D,ROTPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / MSIZE=/]
PUSHJ P,LSTSTR
LDB D,MSKPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / MROT=/]
PUSHJ P,LSTSTR
LDB D,MRTPNT
JRST LSTNUM
LSTF2: MOVEI C,[ASCIZ / M -S CN=/]
PUSHJ P,LSTSTR
LDB D,MPNT
PUSHJ P,LSTNUM
MOVEI A,40
PUSHJ P,LSTOUT
LDB D,S3PNT
PUSHJ P,LSTNUM
LDB D,S2PNT
PUSHJ P,LSTNUM
LDB D,S1PNT
PUSHJ P,LSTNUM
LDB D,S0PNT
PUSHJ P,LSTNUM
MOVEI A,40
PUSHJ P,LSTOUT
LDB D,CNPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / DEST=/]
PUSHJ P,LSTSTR
LDB D,DSTPNT
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / ARLD=/]
PUSHJ P,LSTSTR
LDB D,ARDSTP
PUSHJ P,LSTNUM
MOVEI C,[ASCIZ / BRLD=/]
PUSHJ P,LSTSTR
LDB D,BRDSTP
JRST LSTNUM
;ASSEMB, DOLINE, STRBIN
ASSEMB: PUSHJ P,DOLINE ;ASSEMBLE A LINE OF CODE
PUSHJ P,STRBIN ;DOLINE SKIPS IF NOTHING TO STORE
TLNN F,ENDASM ;SKIP IF IT WAS AN END STATEMENT
JRST ASSEMB
POPJ P,
DOLINE: MOVE A,[440700,,LINBUF]
MOVEM A,LINPNT
TLZ F,ARDST!BRDST
SETZM SAVDST
SETZM BINWRD
DOLINL: PUSHJ P,GETTOK ;GET NEXT TOKEN IN B, SEPARATOR IN A
JRST DOLINE ;UNREC SPEC CHAR
JUMPGE B,DOLIN1 ;JUMP IF IT IS NOT A SYMBOL
MOVSI C,-NPSEUD
MOVE T,(B)
DOLIN2: CAMN T,PSEUTB(C)
JRST DOLINP
DOLIN3: AOBJN C,DOLIN2
CAIE A,":" ;SKIP IF WE ARE DEFINING A SYMBOL
JRST DOLIN4 ;SYMBOL FOLLOWED BY NOT : SEE IF IT'S JUMPIF <SP>
PUSHJ P,SYMLOK ;SEE IF THE SYMBOL IS ALREADY DEFINED
0
JRST DOLMSY ;NOT FOUND. MAKE A NEW SYMBOL
MOVE C,(B) ;FOUND IT. GET THE VALUE
LDB A,[POINT 9,C,17] ;GET SYMBOL TYPE
CAIN A,ADRTYP ;IS IT ALREADY DEFINED?
JRST DOLRDF ;YES, GIVE WARNING AND REDEFINE
CAIE A,FIXTYP ;HAS SYMBOL BEEN USED IN FORWARD REFERENCE ALREADY?
JRST 4,. ;NO? I DON'T KNOW WHAT IT IS, THEN!!!
PUSH P,B ;SAVE POINTER TO SYMBOL
MOVE B,1(B) ;POINTER TO FIXUP,, WORD
JRA B,.+1 ;GET NEXT FIXUP WORD (→ TO NEXT,,INDEX INTO BINBUF)
DOFIXS: LDB A,FIXPNT ;GET VALUE THERE ALREADY
ADD A,L ;ADD IN VALUE OF SYMBOL (I.E. .)
DPB A,FIXPNT ;AND STORE IT BACK
TLNE B,-1
JRA B,DOFIXS
POP P,B ;GET BACK POINTER TO SYMBOL
DOFIX1: MOVSI A,ADRTYP
HRRI A,(L)
MOVEM A,(B) ;CLOBBER TYPE FROM FIXTYP TO ADRTYP AND STORE VALUE
JRST DOLINL
DOLMSY: MOVSI A,ADRTYP
HRRI A,(L)
PUSHJ P,ADDSYM
JRST DOLINL
DOLRDF: WARN [ASCIZ /SYMBOL BEING REDEFINED
/]
JRST DOFIX1
DOLINP: TRNN T,377
TDZA TT,TT ;FILE CONTAINS LESS THAN 5 CHARACTERS
MOVE TT,1(B) ;GET SECOND WORD
CAME TT,PSEUT2(C)
JRST DOLIN3
JRST @PSEUDT(C) ;EXECUTE THIS PSEUDO OPERATION
DOLIN4: CAIE A,11
CAIN A,40 ;GOT SYMBOL FOLLOWED BY NOT : SEE IF IT IS <SP>
JRST DOLJMT
CAIN A,","
JRST DOLCOM ;SYMBOL FOLLOWED BY ,
CAIN A,"="
JRST DOLEQU ;SYMBOL FOLLOWED BY =
DOLJME: ERR [ASCIZ /UNRECOGNIZED FORMAT
/]
JRST CPOPJ1
DOLJMT: MOVE T,(B) ;GOT SYMBOL <SP> SEE IF SYMBOL IS JUMPIF
CAME T,[ASCII /JUMPI/]
JRST DOLJME
MOVE TT,1(B)
CAME TT,[ASCII /F/]
JRST DOLJME
MOVEI A,1 ;HAVE JUMPIF <SP>
DPB A,OPPNT ;STORE JUMP AS OPCODE
PUSHJ P,GETTOK ;WE HAVE A JUMPIF. GET NEXT TOKEN
JRST DOLINE ;UNREC SPEC CHR
JUMPGE B,DOLJME ;MAKE SURE WE GOT A SYMBOL
CAIE A,40 ;MUST GET BRANCH CONDITION <SPACE>
JRST DOLJME
MOVSI C,-NBRCND
MOVE T,TOKBUF
DOLJM1: CAMN T,BRCND(C)
JRST DOLJM2
DOLJM3: AOBJN C,DOLJM1
ERR [ASCIZ /UNKNOWN BRANCH CONDITION
/]
JRST CPOPJ1
DOLJM2: TRNN T,377
TDZA TT,TT
MOVE TT,TOKBUF+1
CAME TT,BRCND1(C)
JRST DOLJM3
TRNN TT,377
TDZA TT,TT
MOVE TT,TOKBUF+2
CAME TT,BRCND2(C)
JRST DOLJM3
PUSHJ P,SYMLOK ;LOOKUP VALUE OF BRANCH CONDITION
BRTYP
JRST 4,. ;NOT FOUND IN SYMBOL TABLE???
HRRZ B,(B) ;GET THE VALUE
DPB B,BRCPNT ;THIS IS THE VALUE OF THE BRANCH CONDITION
PUSHJ P,GETTOK ;NEXT TOKEN MUST BE BRANCH ADDRESS
JRST DOLINE ;UNREC SPEC CHR
MOVEM A,GOTCHR
JUMPG B,DOLFX1 ;JUMP IF GOT A NUMBER
JUMPL B,DOLJM5 ;JUMP IF GOT A SYMBOL
ERR [ASCIZ /ILLEGAL BRANCH ADDRESS
/]
JRST CPOPJ1
DOLJM5: PUSHJ P,SYMLOK ;TRY TO FIND THE SYMBOL IN THE SYMBOL TABLE
0
JRST DOLMFX ;NO THERE.
HRRZ C,(B) ;FOUND IT. GET THE VALUE
LDB A,[POINT 9,(B),17] ;GET SYMBOL TYPE
CAIN A,FIXTYP
JRST DOLJFX ;ALREADY DEFINED AS FIXUP
CAIE A,ADRTYP ;MUST BE A BRANCH ADDRESS TYPE SYMBOL
JRST 4,. ;IT ISN'T???
JRST DOLFX1
DOLMFX: MOVSI A,FIXTYP ;MAKE A FIXUP TYPE SYMBOL POINTING AT THIS L
PUSHJ P,ADDSYM ;ADD THIS SYMBOL TO THE SYMBOL TABLE
MOVE B,SYMNXT
SUBI B,2 ;POINTER TO THE SYMBOL
DOLJFX: HLLZ C,1(B) ;GET THE POINTER TO THE FIRST FIXUP
GETFRE A
HRLM A,1(B)
HRRI C,(L)
MOVEM C,(A) ;STORE →PREV FIXUP LIST,,C(L)
MOVEI C,0 ;STORE ZERO IN THE INSTRUCTION'S BRANCH ADDR FIELD
DOLFX1: DPB C,BRAPNT ;STORE THE BRANCH ADDRESS IN THE INSTRUCTION
PUSHJ P,GETTOK ;GET NEXT THING
JRST DOLINE ;UNREC SPEC CHAR
JUMPN B,DOLFX2
CAIN A,"/"
JRST DOSLAS
CAIN A,";"
JRST SKPEOL
CAIN A,12
JRST DMPLIN ;DUMP OUT LISTING BUFFER AND STORE BINARY
DOLFX2: WARN [ASCIZ /GARBAGE AFTER VALID JUMPIF STATEMENT IGNORED
/]
JRST SKPEOL
DOLIN1: JUMPG B,DOLJME ;STATEMENT BEGINS WITH A NUMBER?
CAIN A,";"
JRST SKPEO1
CAIN A,"<" ;IS IT THE BEGINNING OF A MASK STATEMENT
JRST DOLMAS ;YES, GO DECODE IT.
CAIN A,"/"
JRST DOSLAS
CAIN A,12
JRST SDMPLI ;DUMP LISTING AND SKIP RETURN SINCE NO BINARY
ERR [ASCIZ /UNKNOWN USE OF SPECIAL CHARACTER
/]
JRST CPOPJ1
STRBIN: CAIL L,400
JRST STRBIE
MOVE A,BINWRD
MOVEM A,BINBUF(L)
AOJA L,CPOPJ
STRBIE: ERR [ASCIZ /LOCATION COUNTER OUT OF RANGE
/]
EXIT
;DOLCOM, DOLEQU, DOLMSK
DOLDST: MOVE A,TOKBUF ;GET FIRST WORD OF SYMBOL
CAMN A,[ASCII /AR/]
JRST [ TLO F,ARDST
JRST CPOPJ1 ]
CAMN A,[ASCII /BR/]
JRST [ TLO F,BRDST
JRST CPOPJ1 ]
PUSHJ P,SYMLOK ;SEE IF WE KNOW WHAT THE SYMBOL IS
DSTTYP
JRST [ ERR [ASCIZ /UNDEFINED DESTINATION
/]
POP P,(P)
POPJ P, ]
HRRZ B,(B)
MOVEM B,SAVDST ;SAVE DESTINATION
JRST CPOPJ1
DOLCOM: PUSHJ P,DOLDST
JRST CPOPJ1
JRST DOLINL
DOLEQU: PUSHJ P,DOLDST
JRST CPOPJ1
MOVEI A,1
TLNE F,ARDST
DPB A,ARDSTP
TLNE F,BRDST
DPB A,BRDSTP
SKIPE A,SAVDST
DPB A,DSTPNT
PUSHJ P,EVAL
JRST CPOPJ1
PUSHJ P,GETTOK
JRST CPOPJ1
JUMPE B,DOLEQ1
ERR [ASCIZ /EXTRA GARBAGE AFTER ALU STATEMENT
/]
JRST CPOPJ1
DOLEQ1: CAIN A,"/"
JRST DOSLAS
CAIN A,12
JRST DMPLIN
JRST SKPEOL
DOSLAS: LDB A,OPPNT
CAIN A,2
JRST [ ERR [ASCIZ /CANNOT PERFORM SPEC OP WITH THIS OPCODE
/]
JRST CPOPJ1 ]
PUSHJ P,GTCHR
CAIN A,"="
JRST DOSPEC
CAIE A,12
JRST DOSLAS
TLO F,GOTONE
DOSLA1: ERR [ASCIZ /MISSING SPEC STATEMENT
/]
JRST CPOPJ1
DOSPEC: PUSHJ P,RDNUM
JUMPE D,DOSLA1
CAILE B,14
JRST [ ERR [ASCIZ /SPEC VALUE OUT OF RANGE
/]
JRST CPOPJ1 ]
MOVE C,SPCTB1(B)
DPB C,OPPNT
MOVE C,SPCTB2(B)
DPB C,SPCPNT
JRST SKPEOL
DOLMAS: PUSHJ P,DOLMSK
JRST CPOPJ1
JRST DOLINL
DOLMSK: PUSHJ P,GETTOK
POPJ P, ;UNREC SPEC CHR
JUMPL B,DOLMS1 ;JUMP IF WE GOT A SYMBOL
ERR [ASCIZ /INVALID MASK SPECIFICATION
/]
POPJ P,
DOLMS1: PUSH P,A ;SAVE SEPARATOR
PUSHJ P,SYMLOK ;LOOK UP THE SYMBOL
STYP
JRST [ ERR [ASCIZ /UNDEFINED SOURCE SYMBOL
/]
POP P,(P)
POPJ P, ]
HRRZ B,(B) ;GET VALUE
DPB B,SPNT ;STORE S SELECT FIELD
POP P,A ;GET BACK SEPARATOR
CAIN A,"←"
JRST DOLMS2 ;SHIFT IS SPECIFIED
CAIE A,">"
CAIN A,","
JRST DOLMS3 ;NO SHIFT SPECIFIED
DOLMS4: ERR [ASCIZ /ILLEGAL MASK SPECIFICATION FORMAT
/]
POPJ P,
DOLMS3: TDZA B,B
DOLMS2: PUSHJ P,RDSNUM ;READ NUMBER IN B, SEPARATOR IN A (USE AS SHIFT)
DPB B,ROTPNT
CAIN A,">"
JRST [ MOVEI D,=15 ;MASK NOT SPECIFIED, USE 177777←0
JRST DOLMS5 ]
CAIE A,","
JRST DOLMS4
PUSHJ P,RDNUM
JUMPE D,[MOVEI D,=15 ;MASK NOT SPECIFIED, USE 177777←0
JRST DOLMS5 ]
MOVEI C,1(B)
AND C,B
JUMPN C,[ERR [ASCIZ /MASK NOT RIGHT ADJUSTED STRING OF ONES
/]
POPJ P, ]
MOVEI C,1(B)
JFFO C,.+1
MOVN D,D
MOVEI D,=35-1(D) ;NUMBER OF CONSECUTIVE ONES - 1
DOLMS5: DPB D,MSKPNT
CAIE A,","
CAIN A,">"
JRST [ MOVEI B,0 ;SHIFT NOT SPECIFIED, USE 0
JRST DOLMS6 ]
CAIE A,"←"
JRST DOLMS4
PUSHJ P,RDSNUM ;READ NUMBER IN B, SEPARATOR IN A
DOLMS6: DPB B,MRTPNT
CAIN A,">"
JRST [ MOVEI B,0 ;NO B SEL FIELD SPECIFIED, USE AR
JRST DOLMS7 ]
CAIE A,","
JRST DOLMS4
PUSHJ P,GETTOK
POPJ P,
MOVE B,TOKBUF
CAMN B,[ASCII /AR/]
MOVEI B,0
CAMN B,[ASCII /BR/]
MOVEI B,1
TLNN B,-1
JRST DOLMS7
ERR [ASCIZ /B SELECT FIELD NOT AR OR BR
/]
POPJ P,
DOLMS7: DPB B,BSLPNT
CAIE A,">"
JRST DOLMS4
TLO F,GOTMSK
JRST CPOPJ1
;OPCODE TABLE FOR SPEC FIELD
SPCTB1: 0 ;SPEC 0
1 ;SPEC 1
2 ;SPEC 2
3 ;SPEC 3
3 ;SPEC 4
4 ;SPEC 5
4 ;SPEC 6
5 ;SPEC 7
5 ;SPEC 10
6 ;SPEC 11
6 ;SPEC 12
7 ;SPEC 13
7 ;SPEC 14
;SPEC 3 TABLE FOR SPEC FIELD
SPCTB2: 1 ;SPEC 0
1 ;SPEC 1
0 ;SPEC 2
0 ;SPEC 3
1 ;SPEC 4
0 ;SPEC 5
1 ;SPEC 6
0 ;SPEC 7
1 ;SPEC 10
0 ;SPEC 11
1 ;SPEC 12
0 ;SPEC 13
1 ;SPEC 14
;EVAL
;EVALUATE ALU EXPRESSION
EVAL: TDZ F,[GOTMSK,,PEVAR!PEVBR]
SETZM OPWORD
PUSHJ P,EVL
POPJ P,
TLO F,GOTONE
JRST CPOPJ1
EVL: PUSHJ P,EVLNXT ;GET NEXT ITEM AND SEPARATOR
POPJ P,
CAIN A,")"
PUSHJ P,GTCHR
TRNN F,EVNUM ;SKIP IF EVLREC IS RETURNING A NUMBER
JRST EVAL1
CAIN B,1
JRST EVLNM1 ;B OPERAND IS +1 OR -1
EVLNM2: CAIE B,0
CAIN B,177777
JRST EVLNM
ERR [ASCIZ /NUMBER WITHOUT ≡
/]
POPJ P,
EVLNM: MOVEI C,70 ;M=H, -S3 -S2 -S1 -S0 = 1100, CN = L (F=0000)
CAIN B,177777
MOVEI C,46 ;M=H, -S3 -S2 -S1 -S0 = 0011, CN = L (F=1111)
DPB C,ALUPNT ;STORE ALU FIELD (M -S3 -S2 -S1 -S0 -CN)
MOVE C,OPWORD
TDNN C,[700000,,-1]
JRST CPOPJ1
ERR [ASCIZ /NUMBER MIXED WITH OPERATORS
/]
POPJ P,
EVLNM1: HRRZ C,OPWORD
CAIE C,"+"
CAIN C,"-"
CAIA
JRST EVLNM2
MOVE D,OPWORD
TLNE D,600000
JRST EVLILG
MOVEI D,37 ;M=L, -S3 -S2 -S1 -S0 = 1111, CN = H (F=A+1)
CAIE C,"+"
MOVEI D,0 ;M=L, -S3 -S2 -S1 -S0 = 0000, CN = L (F=A-1)
DPB D,ALUPNT
JRST CPOPJ1
EVLILG: ERR [ASCIZ /IMPOSSIBLE ALU OPERATION
/]
POPJ P,
EVAL1: TRNN F,EVAR!EVBR!EVMASK ;DIDN'T GET A NUMBER, SKIP IF WE GOT AN ITEM
JRST EVAL2 ;DIDN'T GET ITEM, CHECK FOR UNARY OPERATOR OR PARENS
PUSHJ P,BINOPT ;SKIP IF SEPARATOR IS A BINARY OPERATOR
JRST EVAL1A ;SEPARATOR IS NOT A BINARY OPERATOR
MOVE D,OPWORD
TRNE D,-1 ;SKIP IF THERE WAS NO PREVIOUS OPERATOR
JRST EVAL1E ;TWO OPERATIONS - ERROR
HRRM A,OPWORD ;STORE OPERATOR
CAIE A,"+"
CAIN A,"-"
TLNN D,700000 ;SKIP IF NEGATION IS SPECIFIED AT ALL
JRST EVAL1Q ;NO NEGATION OR NOT ARITH OP
ERR [ASCIZ /NEGATION CANNOT BE SPECIFIED IN AN ARITHMETIC OPERATION
/]
POPJ P,
EVAL1E: ERR [ASCIZ /TWO OPERATIONS IN ALU SPECIFICATION
/]
POPJ P,
EVAL1Q: TRNE F,EVMASK
JRST EVL
ERR [ASCIZ /B SELECT MUST COME SECOND IN ALU SPECIFICATION
/]
POPJ P,
EVAL1A: MOVE D,OPWORD
TRNE D,-1
JRST EVAL1B ;JUMP IF WE GOT SECOND ITEM
MOVEI C,40 ;M=H, -S3 -S2 -S1 -S0 = 0000, CN = 0 (F=A)
TLNN F,GOTMSK
MOVEI C,52 ;M=H, -S3 -S2 -S1 -S0 = 0101, CN = 0 (F=B)
TLNE D,700000 ;SKIP IF NO COMPLEMENTING
XORI C,36 ;CHANGE F=A TO F=¬A AND F=B TO F=¬B
DPB C,ALUPNT
JRST CPOPJ1
EVAL1B: HRRZ E,OPWORD ;GET OPERATION
LDB D,[POINT 3,OPWORD,2] ;GET BITS
MOVEI C,0 ;COMPILE ALU FIELD INTO C
CAIN E,"+"
MOVEI C,14 ;M=L, -S3 -S2 -S1 -S0 = 0110, CN = L (F=A+B)
CAIN E,"-"
MOVEI C,23 ;M=L, -S3 -S2 -S1 -S0 = 1001, CN = H (F=A-B)
CAIN E,"∨"
MOVE C,ORTAB(D)
CAIN E,"∧"
MOVE C,ANDTAB(D)
CAIN E,"⊗"
MOVE C,XORTAB(D)
DPB C,ALUPNT
JRST CPOPJ1
EVAL2: CAIN A,"¬"
JRST EVLNT
CAIN A,"("
JRST EVLLP
CAIN A,"≡"
JRST EVLCON
MOVE C,OPWORD
TRNE C,-1
JRST EVAL1B
ERR [ASCIZ /ILLEGAL ALU EXPRESSION
/]
POPJ P,
EVLNT: PUSHJ P,GTCHR
TLO F,GOTONE
MOVEI B,0
CAIN A,"("
JRST [ TLZ F,GOTONE
MOVSI B,400000 ;RESULT INVERTED
JRST EVLNT2 ]
CAIN A,"<"
MOVSI B,200000 ;A OPERAND INVERTED
CAIE A,"A"
CAIN A,"B"
MOVSI B,100000 ;B OPERAND INVERTED
JUMPE B,EVLNT1
EVLNT2: IORM B,OPWORD ;INDICATE APPROPRIATE INVERSION
JRST EVL
EVLNT1: ERR [ASCIZ /INVALID USE OF ¬
/]
POPJ P,
EVLLP: MOVE E,OPWORD
TLNE E,400000
JRST EVL
ERR [ASCIZ /INVALID USE OF PARENTHESES
/]
POPJ P,
EVLCON: PUSHJ P,RDNUM
JUMPN D,EVLCO1
TLO F,GOTONE ;PUT THAT CHAR BACK FOR GETTOK
PUSHJ P,GETTOK
JRST EVLCER
PUSH P,A
PUSHJ P,SYMLOK ;LOOK UP SYMBOL, FOR CONTYPS ONLY
CONTYP
JRST EVLCR1 ;NOT FOUND
POP P,A
HRRZ B,(B) ;GET VALUE
JRST EVLCO1
EVLCER: ERR [ASCIZ /UNRECOGNIZED ≡ SPECIFICATION
/]
POPJ P,
EVLCR1: POP P,A
ERR [ASCIZ /SYMBOL FOLLOWING ≡ MUST BE CONSTANT SYMBOL
/]
POPJ P,
EVLCO1: SKIPN OPWORD
JRST EVLCO2
ERR [ASCIZ /INVALID USE OF ≡ EXPRESSION
/]
POPJ P,
EVLCO2: XORI B,177777 ;STORE COMPLEMENT OF CONSTANT
DPB B,CONPNT
MOVEI C,2
DPB C,OPPNT ;SET OP CODE TO 2 INDICATING CONSTANT
IOR F,[GOTMSK,,EVMASK] ;THIS IS LOGICALLY A MASK FIELD
JRST EVAL1
;GET NEXT ITEM AND SEPARATOR. AN ITEM IS EITHER A NUMBER, THE STRING
;AR, THE STRING BR OR A MASK SPECIFICATION. FLAGS ARE SET IN THE
;RIGHT HALF OF F TO INDICATE WHAT HAS BEEN RETURNED. EVNUM INDICATES
;A NUMBER, EVAR AND EVBR INDICATE THE STRINGS AR AND BR RESPECTIVELY.
;EVMASK INDICATES A MASK SPECIFICATION WAS SCANNED. THE FLAGS PEVAR
;AND PEVBR ARE ALSO SET IN THE RIGHT HALF OF F IF THE STRING AR OR BR
;IS SCANNED. THE DIFFERENCE BETWEEN THESE AND EVAR AND EVBR IS THAT
;THE LATTER TWO AND EVNUM AND EVMASK ARE CLEARED UPON ENTERING EVLNXT.
;EVLNXT ALSO SETS VARIOUS FIELDS IN BINWRD SUCH AS ALUPNT AND BSLPNT.
;THE SEPARATOR IS RETURNED IN A. IF EVLNXT SCANS A NUMBER, THE VALUE
;IS RETURNED IN B.
EVLNXT: TRZ F,EVNUM!EVMASK!EVAR!EVBR
PUSHJ P,GETTOK
POPJ P,
JUMPL B,EVL1 ;JUMP IF SYMBOL IS SPECIFIED
JUMPE B,EVL2 ;ONLY GOT A SEPARATOR
HRRZ B,B ;GET NUMBER
IORI F,EVNUM
JRST CPOPJ1
EVL1: MOVE B,TOKBUF
CAMN B,[ASCII /AR/]
IORI F,EVAR
CAMN B,[ASCII /BR/]
IORI F,EVBR
TRNE F,EVAR!EVBR
JRST EVL1A
ERR [ASCIZ /UNKNOWN B FIELD SELECT
/]
POPJ P,
EVL1A: TRNE F,PEVAR!PEVBR
JRST [ ERR [ASCIZ /MULTIPLE B SELECT SPECIFIED
/]
POPJ P, ]
TRNE F,EVAR
IORI F,PEVAR
TRNE F,EVBR
IORI F,PEVBR
TLNN F,GOTMSK
JRST EVL1B ;MASK NOT YET SPECIFIED
LDB C,BSLPNT ;GET B SELECT FIELD FROM MASK
LDB D,OPPNT
CAIN D,2
JRST EVL1B ;IF A CONSTANT WAS SPECIFIED ANY B SELECT IS OK
JUMPN C,EVL1C ;WAS BR
TRNE F,EVAR
JRST CPOPJ1 ;RETURN INDICATING EVAR OR EVBR
EVL1E: ERR [ASCIZ /INCONSISTENT B SELECT FIELDS
/]
POPJ P,
EVL1C: TRNN F,EVBR
JRST EVL1E
JRST CPOPJ1 ;RETURN INDICATING EVAR OR EVBR
EVL1B: MOVEI C,0
TRNN F,EVAR
MOVEI C,1
DPB C,BSLPNT ;STORE B SELECT FIELD
JRST CPOPJ1 ;RETURN INDICATING EVAR OR EVBR
EVL2: CAIE A,"<"
JRST CPOPJ1 ;LET LEVEL ABOVE FIGURE OUT OPERATORS
TLNE F,GOTMSK
JRST [ ERR [ASCIZ /MULTIPLE MASK SPECIFICATION
/]
POPJ P, ]
PUSHJ P,DOLMSK ;TRY TO PARSE MASK SPECIFICATION
POPJ P,
PUSHJ P,GETTOK
POPJ P,
JUMPE B,EVLMS1
ERR [ASCIZ /ILLEGAL FORMAT
/]
POPJ P,
EVLMS1: IORI F,EVMASK
TRNN F,PEVAR!PEVBR
JRST CPOPJ1
LDB C,BSLPNT ;GET THE B SEL SPECIFIED BY THE MASK
TRNE F,PEVAR
JUMPE C,CPOPJ1 ;IF PEVAR IS SET B SEL BETTER BE ZERO (AR)
TRNE F,PEVBR
JUMPN C,CPOPJ1
ERR [ASCIZ /INCONSISTENT B SELECT FIELD
/]
POPJ P,
BINOPT: CAIE A,"∧"
CAIN A,"∨"
JRST CPOPJ1
CAIE A,"⊗"
CAIN A,"+"
JRST CPOPJ1
CAIN A,"-"
JRST CPOPJ1
POPJ P,
DEFINE LOGIC(S)<1⊗5+<17≠S>⊗1>
ORTAB: LOGIC(16)
LOGIC(15)
LOGIC(10)
LOGIC(4)
LOGIC(1)
LOGIC(2)
LOGIC(7)
LOGIC(13)
ANDTAB: LOGIC(13)
LOGIC(7)
LOGIC(2)
LOGIC(1)
LOGIC(4)
LOGIC(10)
LOGIC(15)
LOGIC(16)
XORTAB: LOGIC(6)
LOGIC(11)
LOGIC(11)
LOGIC(6)
LOGIC(11)
LOGIC(6)
LOGIC(6)
LOGIC(11)
;GETTOK, GTCHR
GETTOK: MOVEI B,0
GETTK1: PUSHJ P,GTCHR
CAIE A,11
CAIN A,40
JRST GETTK1
CAIL A,"A"
CAILE A,"Z"
CAIA
JRST TOKLET
CAIN A,"~"
JRST TOKLET
CAIL A,"0"
CAILE A,"9"
CAIA
JRST TOKNUM
CAIN A,15
JRST GETTK1
CAIN A,12
JRST CPOPJ1
CAIE A,"-"
CAIN A,"¬"
JRST CPOPJ1 ;ALU OPERATORS
CAIE A,"∨"
CAIN A,"∧"
JRST CPOPJ1 ;ALU OPERATORS
CAIE A,"<"
CAIN A,">"
JRST CPOPJ1 ;RETURN WITH MASK SPEC DELIMITERS
CAIE A,"←"
CAIN A,","
JRST CPOPJ1 ;RETURN WITH MASK FIED SEPARATORS
CAIE A,"/"
CAIN A,"="
JRST CPOPJ1 ;MORE VALID SEPARATORS
CAIE A,";"
CAIN A,":"
JRST CPOPJ1
CAIE A,"+"
CAIN A,"≡"
JRST CPOPJ1
CAIE A,")"
CAIN A,"("
JRST CPOPJ1
ERR [ASCIZ /UNRECOGNIZED SPECIAL CHARACTER
/]
POPJ P,
TOKLET: MOVE C,[TOKBUF,,TOKBUF+1]
SETZM TOKBUF
BLT C,TOKBUF+17
MOVE C,[440700,,TOKBUF]
MOVE B,C
TOKLE1: IDPB A,C
PUSHJ P,GTCHR
CAIL A,"A"
CAILE A,"Z"
CAIA
JRST TOKLE1
CAIL A,"0"
CAILE A,"9"
CAIA
JRST TOKLE1
CAIE A,"["
CAIN A,"]"
JRST TOKLE1
CAIE A,"_"
JRST CPOPJ1
JRST TOKLE1
TOKNUM: TDZA C,C
TOKNU1: PUSHJ P,GTCHR
CAIL A,"0"
CAILE A,"9"
JRST TOKNU2
LSH B,3
ADDI B,-"0"(A)
IMULI C,12
ADDI C,-"0"(A)
JRST TOKNU1
TOKNU2: CAIE A,"."
JRST TOKNU3
MOVE B,C
PUSHJ P,GTCHR
TOKNU4: TLO B,1
JRST CPOPJ1
TOKNU3: MOVE C,B
JRST TOKNU4
GTCHR2: PUSHJ P,LSTOUT
AOS PAGE
MOVEI A,1
MOVEM A,LINE
GTCHR: TLZE F,GOTONE
POPJ P,
MOVEI A,0
EXCH A,GOTCHR
JUMPN A,CPOPJ
SOSG SRCHDR+2
IN SRC,
JRST GTCHR1
OUTSTR [ASCIZ /END OF FILE AND NO END STATEMENT
/]
EXIT
GTCHR1: ILDB A,SRCHDR+1
JUMPE A,GTCHR
CAIN A,14
JRST GTCHR2
IDPB A,LINPNT
CAIL A,"a"
CAILE A,"z"
CAIA
SUBI A,40
POPJ P,
;PSEUTB, PSEUT2, PSEUDT, ACOMNT, ALOC, AEND, ADEBUG, RDNUM, RDSNUM, SKPEOL, ASET
PSEUTB: ASCII /COMME/
ASCII /LOC/
ASCII /END/
ASCII /DEBUG/
ASCII /SET/
NPSEUD←←.-PSEUTB
PSEUT2: ASCII /NT/
0
0
0
0
PSEUDT: ACOMNT
ALOC
AEND
ADEBUG
ASET
ACOMN1: PUSHJ P,GTCHR
ACOMNT: CAIE A,40
CAIN A,11
JRST ACOMN1
MOVE B,A ;THIS IS THE DELIMITER
ACOMN2: PUSHJ P,GTCHR
CAIN A,(B) ;IS IT THE DELIMITER
JRST SKPEO1 ;YES
CAIE A,12
JRST ACOMN2
PUSHJ P,SDMPLI
JFCL
JRST ACOMN2
ALOC: PUSHJ P,RDNUM
JUMPN D,ALOC1
ERR [ASCIZ /NON-NUMERIC OR MISSING ARGUMENT TO LOC
/]
JRST CPOPJ1
ALOC1: CAIL B,400
JRST [ ERR [ASCIZ /LOC OUT OF RANGE
/]
JRST CPOPJ1 ]
MOVE L,B
JRST SKPEO1
ASET: PUSHJ P,GETTOK
JRST ASETER
CAIE A,"="
JRST ASETER
JUMPGE B,ASETER ;JUMP IF WE DIDN'T GET A SYMBOL
PUSHJ P,RDNUM
JUMPE D,ASETER ;JUMP IF DIDN'T GET MUCH OF A NUMBER
HRLI B,CONTYP
PUSH P,B ;SAVE VALUE
PUSHJ P,SYMLOK ;SEE IF THE SYMBOL IS ALREADY DEFINED
0
JRST ASET1 ;NOT FOUND. MAKE A NEW SYMBOL
LDB A,[POINT 9,(B),17] ;GET SYMBOL TYPE
CAIE A,CONTYP
JRST ASET2
WARN [ASCIZ /CONSTANT SYMBOL BEING REDEFINED
/]
POP P,(B) ;STORE NEW VALUE
JRST SKPEO1
ASET1: POP P,A
PUSHJ P,ADDSYM ;ADD CONSTANT TYPE SYMBOL
JRST SKPEO1
ASET2: ERR [ASCIZ /ALREADY A SYMBOL WITH THAT NAME
/]
JRST CPOPJ1
ASETER: ERR [ASCIZ /UNRECOGNIZED SET STATEMENT
/]
JRST CPOPJ1
AEND: TLO F,ENDASM
ADEBUG: JRST SKPEO1
;RETURN NUMBER IN B, ASSUMED OCTAL UNLES FOLLOWED BY A DECIMAL POINT.
;D GETS THE NUMBER OF DIGITS FOUND.
RDNUM: SETZB B,C
MOVEI D,0
RDNUM1: PUSHJ P,GTCHR
CAIE A,40
CAIN A,11
JRST RDNUM1
CAIL A,"0"
CAILE A,"9"
JRST RDNUM2
IMULI C,12
ADDI C,-"0"(A)
LSH B,3
ADDI B,-"0"(A)
AOJA D,RDNUM1
RDNUM2: CAIE A,"."
POPJ P,
MOVE B,C
JRST GTCHR
RDSNUM: PUSHJ P,GTCHR
CAIN A,"-"
JRST RDSNU1
TLO F,GOTONE
JRST RDNUM
RDSNU1: PUSHJ P,RDNUM
JUMPE D,CPOPJ
MOVN B,B
ADDI B,=16
POPJ P,
SKPEOL: PUSHJ P,GTCHR
CAIE A,12
JRST SKPEOL
JRST DMPLIN
SKPEO1: PUSHJ P,GTCHR
CAIE A,12
JRST SKPEO1
JRST SDMPLI
;BRCND, BRCND1, BRCND2
BRCND: ASCII /MEM_D/
ASCII /~MEM_/
ASCII /MIOBC/
ASCII /RESET/
ASCII /MASKI/
ASCII /~MASK/
ASCII /~MASK/
ASCII /MASK[/
ASCII /MICRO/
ASCII /TRUE/
ASCII /MICRQ/
NBRCND←←.-BRCND
BRCND1: ASCII /ONE/
ASCII /DONE/
ASCII /_BUSY/
ASCII /_COND/
ASCII /S0/
ASCII /IS0/
ASCII /[0]/
ASCII /0]/
ASCII /_RPE/
0
ASCII /_RQ_S/
BRCND2: 0
0
0
0
0
0
0
0
0
0
ASCII /YNC/
;SYMBOL TABLE FORMAT, PRSYMS, PSEUTB
COMMENT ⊗
VALUE TYPE,,VALUE
POINTER TO LIST OF FIXUPS ,, POINTER TO ASCIZ SYMBOL NAME
ABOVE REPEATED FOR EACH SYMBOL
⊗
DEFINE PRESYM (SYM,TYPE,VAL) <
TYPE,,VAL
[ASCIZ \SYM\]
>
PRSYMS:
PRESYM (<~SEL_BUS_REG>,DSTTYP,1)
PRESYM (<MA_HI>,DSTTYP,2)
PRESYM (<MA_LO>,DSTTYP,3)
PRESYM (<VBIT>,DSTTYP,4)
PRESYM (<ABIT>,DSTTYP,5)
PRESYM (<MAPRAM>,DSTTYP,6)
PRESYM (<~PTPNT>,DSTTYP,7)
PRESYM (<MAP_ENB>,DSTTYP,10)
PRESYM (<AR>,STYP,0)
PRESYM (<BR>,STYP,1)
PRESYM (<PADR_MICRO>,STYP,2)
PRESYM (<MICRQ_SEL>,STYP,2)
PRESYM (<MS[0_3]>,STYP,2)
PRESYM (<MS[4_19]>,STYP,3)
PRESYM (<MS[20_35]>,STYP,4)
PRESYM (<~VBIT_NEW_BIT>,STYP,5)
PRESYM (<~VBIT>,STYP,6)
PRESYM (<PTPNT>,STYP,7)
PRESYM (<MEM_DONE>,BRTYP,0)
PRESYM (<~MEM_DONE>,BRTYP,1)
PRESYM (<MIOBC_BUSY>,BRTYP,2)
PRESYM (<RESET_COND>,BRTYP,4)
PRESYM (<MASKIS0>,BRTYP,6)
PRESYM (<~MASKIS0>,BRTYP,7)
PRESYM (<~MASK[0]>,BRTYP,10)
PRESYM (<MASK[0]>,BRTYP,11)
PRESYM (<MICRO_RPE>,BRTYP,12)
PRESYM (<TRUE>,BRTYP,14)
PRESYM (<MICRQ_RQ_SYNC>,BRTYP,15)
LPRSYM←←.-PRSYMS
;CONSTANTS, VARIABLES AND TABLES
PDL: BLOCK 100
SRCHDR: BLOCK 3
SRCFIL: SIXBIT /MPX/
SIXBIT /MIC/
0
SIXBIT /MPXJBR/
LSTHDR: BLOCK 3
LSTFIL: SIXBIT /MPX/
SIXBIT /LST/
0
SIXBIT /MPXJBR/
BINFIL: SIXBIT /MPX/
SIXBIT /BIN/
0
SIXBIT /MPXJBR/
ROMHDR: BLOCK 3
ROMFIL: SIXBIT /MPX/
SIXBIT /ROM/
0
SIXBIT /MPXJBR/
INSHDR: BLOCK 3
INSFIL: SIXBIT /MPX/
SIXBIT /INS/
0
SIXBIT /MPXJBR/
BINBUF: BLOCK 400 ;ASSEMBLE THE MICROCODE HERE
BINWRD: 0
LINBUF: BLOCK 100 ;BUFFER FOR ONE LINE OF TEXT
LINPNT: 440700,,LINBUF
SYMPNT: 0 ;ADDRESS OF SYMBOL TABLE (AT TOP OF CORE)
SYMNXT: 0 ;POINTER TO 1 + LAST SYMBOL STORED
NXTFRE: 0 ;POINTER TO NEXT FREE STORAGE LOCATION
TOKBUF: BLOCK 20
GOTCHR: 0
UNSYMS: 0 ;FLAG SET IF ANY UNDEFINED SYMBOLS
SAVDST: 0 ;DESTINATION SAVED HERE ON COMMA
PAGE: 0
LINE: 0
UUOACS: BLOCK 20
OPPNT: POINT 3,BINWRD,6 ;BYTE POINTER TO OPCODE FIELD
BRCPNT: POINT 4,BINWRD,26 ;BYTE POINTER TO BRANCH CONDITION FIELD
BRAPNT: POINT 8,BINWRD,34 ;BYTE POINTER TO BRANCH ADDRESS FIELD
FIXPNT: POINT 8,BINBUF(B),34 ;BYTE POINTER TO BRANCH ADDRESS FIELD
ARDSTP: POINT 1,BINWRD,33 ;BYTE POINTER TO AR LOAD FIELD
BRDSTP: POINT 1,BINWRD,34 ;BYTE POINTER TO BR LOAD FIELD
DSTPNT: POINT 4,BINWRD,32 ;BYTE POINTER TO DESTINATION FIELD
SPNT: POINT 3,BINWRD,10 ;BYTE POINTER TO S SELECT FIELD
ROTPNT: POINT 4,BINWRD,22 ;BYTE POINTER TO ROT FIELD
MSKPNT: POINT 4,BINWRD,14 ;BYTE POINTER TO MASK SIZE FIELD
MRTPNT: POINT 4,BINWRD,18 ;BYTE POINTER TO MASK ROTATE FIELD
BSLPNT: POINT 1,BINWRD,35 ;BYTE POINTER TO B SEL FIELD
ALUPNT: POINT 6,BINWRD,28 ;BYTE POINTER TO ALU M, -S3 -S2 -S1 -S0, CN FIELD
SPCPNT: POINT 1,BINWRD,7 ;BYTE POINTER TO SPEC 3 FIELD
CONPNT: POINT 16,BINWRD,22 ;BYTE POINTER TO CONSTANT FIELD
MPNT: POINT 1,BINWRD,23 ;BYTE POINTER TO ALU M FIELD
S3PNT: POINT 1,BINWRD,24 ;BYTE POINTER TO ALU -S3 FIELD
S2PNT: POINT 1,BINWRD,25 ;BYTE POINTER TO ALU -S2 FIELD
S1PNT: POINT 1,BINWRD,26 ;BYTE POINTER TO ALU -S1 FIELD
S0PNT: POINT 1,BINWRD,27 ;BYTE POINTER TO ALU -S0 FIELD
CNPNT: POINT 1,BINWRD,28 ;BYTE POINTER TO ALU CN FIELD
OPWORD: 0 ;RIGHT HALF IS INTERNAL ALU OP CODE
;LEFT HALF IS BITS AS FOLLOWS:
;400000 COMPLEMENT RESULT
;200000 COMPLEMENT A OPERAND
;100000 COMPLEMENT B OPERAND
MAC1: ASCIZ /$M+1;774000017776
/
PATCH: BLOCK 40
END GO